import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * 演示如何在大型Java项目中搜索使用java.util.ArrayList类的代码
 */
public class ArrayListSearchExample {

    // 定义正则表达式模式为常量
    private static final Pattern ARRAYLIST_PATTERN = Pattern.compile("ArrayList<.*>|ArrayList\\s+");

    public static void main(String[] args) {
        // 示例：搜索当前目录下所有Java文件中使用ArrayList的代码
        String projectRoot = System.getProperty("user.dir");
        searchArrayListUsage(projectRoot);
    }

    /**
     * 搜索指定目录下所有Java文件中使用ArrayList的代码
     * @param rootDirectory 项目根目录
     */
    public static void searchArrayListUsage(String rootDirectory) {
        try {
            // 获取所有Java文件
            List<Path> javaFiles = Files.walk(Paths.get(rootDirectory))
                    .filter(path -> path.toString().endsWith(".java"))
                    .collect(Collectors.toList());
            
            System.out.println("找到 " + javaFiles.size() + " 个Java文件");
            
            // 遍历每个Java文件
            for (Path file : javaFiles) {
                List<String> lines = Files.readAllLines(file);
                List<Integer> matchingLines = new ArrayList<>();
                
                // 检查每一行是否包含ArrayList
                for (int i = 0; i < lines.size(); i++) {
                    String line = lines.get(i);
                    if (ARRAYLIST_PATTERN.matcher(line).find()) {
                        matchingLines.add(i + 1); // 行号从1开始
                    }
                }
                
                // 如果找到匹配的行，输出文件路径和行号
                if (!matchingLines.isEmpty()) {
                    System.out.println("\n文件: " + file);
                    System.out.println("使用ArrayList的行号: " + matchingLines);
                    
                    // 输出匹配行的内容
                    System.out.println("匹配行内容:");
                    for (int lineNum : matchingLines) {
                        System.out.println("  行 " + lineNum + ": " + lines.get(lineNum - 1));
                    }
                }
            }
        } catch (IOException e) {
            System.err.println("搜索过程中发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 使用IDE工具搜索的示例代码
     * 注意：这部分代码仅作为示例，实际使用时需要根据具体IDE的API进行调整
     */
    public static void ideSearchExample() {
        // 以下是使用不同IDE工具搜索的示例代码
        
        // 1. 使用IntelliJ IDEA的API
        /*
        Project project = ProjectManager.getInstance().getOpenProjects()[0];
        GlobalSearchScope scope = GlobalSearchScope.projectScope(project);
        PsiClass arrayListClass = JavaPsiFacade.getInstance(project)
                .findClass("java.util.ArrayList", scope);
        
        if (arrayListClass != null) {
            ReferencesSearch.search(arrayListClass, scope).forEach(reference -> {
                PsiElement element = reference.getElement();
                System.out.println("文件: " + element.getContainingFile().getName());
                System.out.println("行号: " + ((PsiJavaFile) element.getContainingFile())
                        .getLineNumber(element.getTextOffset()) + 1);
            });
        }
        */
        
        // 2. 使用Eclipse的API
        /*
        IJavaProject javaProject = JavaCore.create(project);
        IType arrayListType = javaProject.findType("java.util.ArrayList");
        
        if (arrayListType != null) {
            IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { javaProject });
            SearchPattern pattern = SearchPattern.createPattern(arrayListType, 
                    IJavaSearchConstants.REFERENCES, SearchPattern.R_EXACT_MATCH);
            
            SearchEngine searchEngine = new SearchEngine();
            searchEngine.search(pattern, new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant() }, 
                    scope, new IJavaSearchResultCollector() {
                        @Override
                        public void acceptSearchMatch(SearchMatch match) {
                            IJavaElement element = (IJavaElement) match.getElement();
                            System.out.println("文件: " + element.getPath());
                            System.out.println("行号: " + match.getLine());
                        }
                    }, null);
        }
        */
    }
} 